﻿using System.Collections.Generic;
using System.Windows;
using System.Linq;

namespace ibba.src.noriskbo
{
    public static class AsyncSingletonProdutoModalidade
    {
        public delegate void EndAsyncResult(List<ServiceCorporativo.ProdutoModalidade> pEndAsyncResult);
        private static event EndAsyncResult OnEndAsyncResult;

        private static readonly object syncLock = new object();

        private static List<ServiceCorporativo.ProdutoModalidade> _instance;
        private static bool _inProgress = false;

        public static void ObterLista(EndAsyncResult pEndAsyncResult)
        {
            lock (syncLock)
            {
                if (_instance == null)
                {
                    OnEndAsyncResult += pEndAsyncResult;

                    if (_inProgress == false)
                    {
                        _inProgress = true;

                        ServiceFactory.Instance.ServiceCorporativo.BeginObterProdutosModalidades((pAsyncResult) =>
                        {
                            Deployment.Current.Dispatcher.BeginInvoke(delegate()
                            {
                                var retorno = ((ServiceCorporativo.ICorporativo)pAsyncResult.AsyncState).EndObterProdutosModalidades(pAsyncResult);

                                //var result = new List<ServiceCorporativo.ProdutoModalidade>();
                                //result.Add(new ObterListaTipoCorVeiculo_Result { Id = 0, Descricao = "" });

                                //if (RetornoServicoHelper.RetornoOk(retorno))
                                //{
                                //    result.AddRange(retorno.Retornok__BackingField);
                                //    _Instance = result;
                                //}

                                _instance = retorno;

                                lock (syncLock)
                                {
                                    _inProgress = false;
                                }

                                OnEndAsyncResult(_instance);
                                OnEndAsyncResult = null;
                            });

                        }, ServiceFactory.Instance.ServiceCorporativo);
                    }
                }
                else
                {
                    pEndAsyncResult(_instance);
                }

            }
        }

        public static void Release()
        {
            _instance = null;
        }

        public static List<string> ObterListaProdutos()
        {
            return (from o in _instance
                    select o.cd_Produto.Trim()).Distinct().ToList();
        }

        public static List<ServiceCorporativo.ProdutoModalidade> ObterListaModalidades(string pCodigoProduto)
        {
            if (_instance != null)
                return (from o in _instance
                        where o.cd_Produto.Trim().Equals(pCodigoProduto, System.StringComparison.OrdinalIgnoreCase)
                        orderby o.cd_Modalidade
                        select o).Distinct().ToList();

            else
                return null;
        }
    }
}
